import pandas as pd
from flask import (Blueprint, request, session)
from flaskr import Utils
bp = Blueprint('separate',__name__, url_prefix='/separate')
from flaskr.server.FilterDataServer import *
from flaskr.server.SheetsServer import *

#这个模块用于 数据列的合并与拆分

@bp.route('',methods = ['POST'])
def separate():
    sheet_name = request.json.get('sheet_name')
    column_name = request.json.get('column_name')
    column_names = request.json.get('column_names')
    symbol = request.json.get('symbol')

    sheets = session['sheets']
    df = None

    sheet = get_sheet(sheet_name)
    df = get_dataframe(sheet_name)

    if sheet is not None and df is not None:
        df_separate = separate(df, column_name, column_names, symbol)

        if has_pkl(sheet_name):
            df_separate = df_separate.head(200)
            setPkl(df_separate, sheet['md5'])

        sheet['table'] = Utils.dataFrameToHtml(df_separate)
        sheet['json'] = Utils.dataFrameToJson(df_separate)
        sheet['columns'] = Utils.getColumns(df_separate)
        sheet['types'] = Utils.getTypes(df_separate)

        set_sheet(sheet_name, sheet)

        filter_data_server = FilterDataServer(session)
        filter_data_server.remove_filter_container(sheet_name)

        return {
            'msg': '拆分成功',
            'code': 200,
            'data': sheet
        }
    # for sheet in sheets:
    #     if sheet['showName'] == sheet_name:
    #         sheet_json = sheet['json']
    #
    #         df = Utils.jsonToDataFrame(sheet_json)
    #         df_separate = separate(df, column_name, column_names, symbol)
    #
    #         sheet['table'] = Utils.dataFrameToHtml(df_separate)
    #         sheet['json'] = Utils.dataFrameToJson(df_separate)
    #         sheet['columns'] = Utils.getColumns(df_separate)
    #         sheet['types'] = Utils.getTypes(df_separate)
    #         session['sheets'] = sheets
    #         filter_data_server = FilterDataServer(session)
    #         filter_data_server.remove_filter_container(sheet_name)
    #
    #         return {
    #             'msg': '拆分成功',
    #             'code': 200,
    #             'data': sheet
    #         }

    # df = Utils.jsonToDataFrame(json_)
    # 获取一个合并后的数据

    return {
        'msg': '拆分失败',
        'code': 500,
        'data': None,
    }


#数据的拆分  第一个参数是DataFrame, 第二个参数是要拆分的列名， 第三个参数是要更改拆分列名与拆分后列名的名字, 第三个参数是分隔符
def separate(df, column_name, column_names, symbol):
    arr = separateArray(df[column_name], symbol)
    
    #如果arr为None 返回原数据
    if(arr is None):    
        err_msg = "没有填入分隔符"
        return df, err_msg

    df_result = separateDataFrame(df, arr, column_name, column_names)

    return df_result

def separateArray(arr, symbol):
    if(len(symbol) < 1):
        return None

    column1 = []
    column2 = []

    for v in arr:
        res = v.split(symbol, 1)

        if(len(res) > 1):
            column1.append(res[0])
            column2.append(res[1])
        else:
            column1.append(res[0])
            column2.append(None)

    return column1, column2

#column_name是要拆分的列， column_names是拆分列的名字
def separateDataFrame(df,arr,column_name,column_names):

    columns = getColumns(df)

    columns.remove(column_name)

    dict_ = {}

    for i in range(len(column_names)):
        dict_[ column_names[i] ] = arr[i]

    df_old = df #将数据备份到df_old

    df = df.loc[:, columns] #过滤掉要拆分的列名

    df_new = pd.DataFrame(dict_) #把拆分的数据转换成DataFrame
    
    df_new = pd.concat([df, df_new], axis=1) #合并两个DataFrame的列


    df_notnull = df_new[df_new.notnull() == True].count() #获取所有列的空值个数
     
    #如果个数相等，说明没有分割列中的任何数据
    if(df_notnull[column_names[1]] == 0):
        # err_msg = "分割失败，没有找到要分割的数据"
        return df_old

    return df_new

#返回一个DataFrame的所有列的数组
def getColumns(df):
    columns = []
    for column in df.columns:
        columns.append(column)
    return columns

#删除数组中的元素   第一个参数是数组   第二个参数是数组要删除的元素
def removeArray(arr, data):

    if (type(data) is list):
        for d in data:
            arr.remove(d)

    else:
        arr.remove(data)